Prise en main de l'IDE Pyzo et du language Python
Table des matières
Première connexion et configuration
Connexion à l'ordinateur
- Allumer l'ordinateur.
 - Se connecter.
- votre identifiant est de la forme 
prenom.nomsans accents- éventuellement tronqués au premier sous mot (avant tout 
-ou espace). - éventuellement de la forme 
p.nom, oùpest la première lettre du prénom. 
 - éventuellement tronqués au premier sous mot (avant tout 
 - votre mot de passe est votre date de naissance, sous la forme 
jjmmaaaa. 
 - votre identifiant est de la forme 
 
Configuration de Pyzo
Pyzo est un IDE (Integrated Development Environment : un logiciel qui regroupe plusieurs outils utiles au développement) pour la programmation en Python. C'est un logiciel libre.
Lancer l'application
Pyzo
Pyzodétecte automatiquement un environnementPythonpréinstallé. Si nécessaire, cliquer sur le lien pour confirmer l'utilisation de cet environnement.
Le logiciel Pyzo présente plusieurs fenêtres. On n'utilisera que les deux fenêtres suivantes — fermer les autres.
- L'éditeur de texte interactif.
 - Le shell, ou invite de commande. Sa fenêtre ressemble à la fenêtre de droite de la capture suivante. Selon la configuration, l'invite 
In [1]:du shellIPythonpeut être remplacée l'invite $\inv$ du shell de base. 
- (optionnel, utile pour cette séance) Configurer l'utilisation de 
IPython:- Dans le menu 
Shell, choisirConfiguration des shells - Cocher 
Utilise IPython si disponible, puisDone. - Menu 
Shell>Redémarrer. 
 - Dans le menu 
 
Ouvrir le fichier .py associé au TP
Ouvrir le fichier T:/travail/CPGE/MPSI3/ITC/00 Prise en main.py.
Celui-ci contient un squelette, à remplir pendant le TP.
1. Le shell
L'invite In [1]: (ou $\inv$ selon les versions) vous invite à entrer
une commande, ou plutôt une expression dans le langage Python. Le
shell va alors l'exécuter, et vous donner le résultat. Accepter
l'invitation en écrivant une expression arithmétique comme 1+1, et
appuyer sur la touche entrée.
Comme expliqué dans le message de bienvenue, en plus d'évaluer des expressions dans le langage Python, le shell
- permet d'accéder à de la documentation, ou des détails sur des objets 
Python, viahelp, ouhelp(objet). - accepte des commandes «magiques». Par exemple, la commande 
%time(outimeit) permet de mesurer le temps d'exécution de codePython. 
1.1. Premiers types et opérateurs
Les objets manipulés ont un type, dont voici les plus élémentaires, et ce qu'ils représentent.
type Python | 
représente | exemples de valeurs | 
|---|---|---|
int (integer) | 
un nombre entier relatif | 1, -3 | 
float (floating-point) | 
un nombre à virgule, appelé un flottant | 1.133 | 
str (string) | 
du texte, appelé chaîne de caractères | "Jean Jaurès" | 
bool (boolean) | 
Vrai/Faux, appelé booléen | True, False | 
Autre type fondamental : les listes, comme [3, 2, 6, 4], qui représentent un tableau de valeurs.
Les opérateurs arithmétiques de base +, -, *, / sont définis en Python. On peut utiliser le shell comme une calculatrice.
L'expression 10 / 2 renvoie 5.0, c'est-à-dire une valeur flottante, même si $10$ est divisible par $2$.
Il faut être attentif au type d'un objet, car un même opérateur peut avoir des sens différents selon le type auquel il s'applique.
Que renvoient ces expressions ? En particulier, quel est le type du résultat
3 + 53 + 5.0"bon" + "jour"True + False
1.2. Variables et affectation
Les variables en Python ne sont pas comme des variables en mathématiques, qui peuvent prendre n'importe quelle valeur. Une variable Python n'existe que lorsqu'elle a été définie en y mettant une valeur particulière, ce qu'on appelle l'affectation. Une variable Python est comme une case mémoire.
In [1]: a = 3 # Définition d'une variable a # le shell ne renvoie rien In [2]: a * 2 # On utilise la variable Out[2]: 6
In [3]: b = a+2 In [4]: a = a*a
In [5]: a Out[5]: 9 In [6]: a+b Out[6]: 14
Les instructions précédentes définissent une variable a, et lui affectent initialement la valeur $3$. Cette variable peut être utilisée dans les expressions suivantes, elle y est remplacée par sa valeur. L'instruction a=a*a réaffecte la valeur $9$ à la variable a.
Noter que les affectations ne renvoient rien : il n'y a pas de résultat (pas de Out).
Les noms de variables sont des séquences de lettres ou de chiffres, commençant toujours par une lettre, sans caractères spéciaux (hormis l'underscore $\underline{\,\,\,\,}$) et sensibles à la casse (majuscule vs minuscule).
Compléter le tableau suivant :
| Instruction | type de a | 
type de b | 
valeur dans la variable a | 
valeur dans la variable b | 
|---|---|---|---|---|
a = 5 * 9 | 
\cellcolor{gray!50} | \cellcolor{gray!50} | ||
b = a / 2 | 
\cellcolor{gray!50} | \cellcolor{gray!50} | ||
a = int(b) | 
\cellcolor{gray!50} | \cellcolor{gray!50} | ||
a = b - 4*a | 
\cellcolor{gray!50} | \cellcolor{gray!50} | ||
a = "b" + "a" | 
\cellcolor{gray!50} | \cellcolor{gray!50} | 
1.3. Les entiers
Les entiers relatifs sont représentés en Python par le type int (pour integer). Contrairement à d'autres langages de programmation, le type int de Python permet de représenter des entiers arbitrairement grands.
En plus des opérations +,-,*, Python définit les opérateurs suivants.
a % b | 
le reste de la division euclidienne de a par b. | 
a // b | 
le quotient de la division euclidienne de a par b. | 
a ** b | 
a puissance b. | 
In [1]: 42 % 10 Out[1]: 2
In [2]: 42 // 10 Out[2]: 4
In [3]: 3 ** 3 Out[3]: 27
L'opérateur de division / renvoie un flottant (un nombre à virgule), même si la division est entière : 6 / 2 renvoie 3.0. Pour obtenir l'entier 3, il faut utiliser 6 // 2.
Cela peut être source d'erreurs : d'une part certaines fonctions demandent des arguments entiers (comme range pour une itération), d'autre part les opérations d'arithmétique sur les flottants ne sont pas toujours exactes.
L'opérateur de puissance ** renvoie un flottant si l'exposant est négatif. Il fonctionne aussi avec des arguments flottants : 1.2 ** 2.3 renvoie 1.5209…
Ne pas utiliser $a^\wedge b$ pour calculer $a^b$. Manque de chance, cet opérateur existe donc le code s'exécutera sans erreurs, mais au lieu de calculer $a^b$, il réalise un XOR bit par bit.
On considère la suite $(u_n)$ définie par $u_0 = 7$ et $\forall n\in\N,\,u_{n+1} = 2 u_n^2$. Pour $n\in\N$, on note $q_n$ et $r_n$ le quotient et le reste de la division euclidienne de $u_n$ par $17$.
- Déterminer $r_6$, puis le chiffre des unités de $q_6$. \hfill Indication : Utiliser une unique variable 
uet des instructionsu = 2*u*u. ★ Donner une expression explicite de $u_n$ en fonction de $n$.
Indication : Conjecturer à partir des premières valeurs, ou se ramener à une suite $(v_n)$ vérifiant $v_{n+1} = v_n^2$.
1.4. Mesurer le temps d'exécution
La commande magique %time (ou timeit pour le shell en $\inv$) permet de mesurer le temps d'exécution. Dans l'exemple suivant, le calcul de $7^{2^{20}}$ prend 234 ms1.
In [1]: a = 2 ** 20 In [2]: %time b = 7 ** a CPU times: user 224 ms, sys: 10.1 ms, total: 234 ms Wall time: 234 ms
# Syntaxe correspondant à l'autre shell. >>> timeit 7**(2**20) 0.23074946599808754 seconds on average
Comparer avec le temps nécessaire pour calculer $8^{2^{20}}$. ★ Comment expliquer la différence2 ?
Pour calculer $7^{2^{20}}$ Python n'effectue pas $2^{20}-1$ multiplications, mais seulement $20$ (avec de très grands nombres, ce qui explique le temps d'exécution). Comment3 ?
Si l'exécution ne termine pas, les icônes en haut du shell permettent de l'interrompre.
1.5. Le module math
Exécuter la commande import math pour importer le module math de Python. Ce module définit les fonctions mathématiques usuelles. Noter en particulier les fonctions math.sqrt (square root, pour racine carrée), math.log (logarithme), math.exp (exponentielle), math.floor (partie entière), ainsi que les constantes math.e et math.pi.
- On peut trouver une liste des fonctions du module en exécutant 
help(math). - Vous pouvez obtenir la documentation d'une fonction en particulier en exécutant 
help(math.log). On peut y lire que cette fonctionlogpeut prendre un deuxième argument facultatif donnant la base du logarithme. Par exemplelog(2 ** 10, 2)renverra le logarithme en base $2$ de $2^{10}$, c'est-à-dire10.0. - Exécuter 
from math import sqrtpermet d'utiliser la fonctionsqrtsans le préfixemath. Exécuterfrom math import *importe toutes les fonctions du modulemath. 
- Comment récupérer le quotient de la division euclidienne de $a$ par $b$, sans utiliser les opérateurs 
//ou%? - Comparer les résultats des deux méthodes pour $a = 7^{32}$ et $b = 100$. Quel est le résultat correct ? Pouvez-vous expliquer ?
 
2. L'éditeur de texte
2.1. Définition d'une fonction
Dans l'éditeur de texte, recopier le code Python suivant. Il définit une fonction puiss_quatre qui prend un argument, noté x, et renvoie cet argument élevé à la puissance quatre, il définit également une variable e et calcule la puissance quatrième de $e$.
def puiss_quatre(x): # Définition d'une fonction nommée puiss_quatre b = x*x # Affectation d'une variable intermédiaire return b*b # La fonction renvoie b*b e = 3 # Retour à l'indentation : en dehors de la fonction print(puiss_quatre(e))
L'interpréteur Python ignore la fin des lignes à partir du symbole #. Cela permet d'annoter le code de commentaires, pour le lecteur.
Attention à la syntaxe. Pour définir une fonction :
- Utiliser le mot clef 
def, suivi du nom de la fonction, puis de ses arguments, entre parenthèses. - Ne pas oublier les 
:à la fin de cette ligne. - Indenter les instructions appartenant au corps de la fonction.
 
En Python l'indentation (l'espace au début de certaines lignes) est importante. Dans l'exemple plus haut, elle signale à l'interpréteur quelles instructions font partie du corps de la fonction.
L'indentation est insérée automatiquement (par le shell également) quand vous appuyez sur la touche Entrée depuis la ligne précédente qui termine par :. Pour modifier l'indentation, utiliser les touches Tab (ajoute de l'indentation) et Shift + Tab (retire de l'indentation), depuis le début de la ligne.
2.2. Un éditeur interactif
Une fois le code précédent recopié (sans les commentaires), appuyer sur Ctrl+Entrée (ou Cmd+Entrée) pour faire exécuter le code dans le shell. Dans le shell, la variable e et la fonction puiss_quatre sont alors définies et le résultat de l'instruction puiss_quatre(2) est affiché. Il est maintenant possible d'exécuter dans le shell la commande puiss_quatre(e) pour obtenir $3^{4}=81$.
Bien qu'il soit possible de définir cette fonction directement dans le shell, l'éditeur permet
- de sauvegarder votre code dans un fichier source 
.py - de modifier/corriger le code écrit avant de le réévaluer, ou de le copier-coller plus facilement
 
- En utilisant l'extrait ci-contre, écrire une fonction 
fois_septqui prend en argument une variablexet renvoiex+x+…+x. - Dans le Shell, essayer les appels 
fois_sept(4),fois_sept(1/7),fois_sept("abc")etfois_sept([1,2,3]). 
y = x # range(6) tourne 6 fois for i in range(6): y = y + x
Pour exécuter le fichier source, utiliser le raccourci Ctrl+Entrée.
Il est possible de séparer le fichier source en «cellules», délimitées par des lignes commençant par ### — chaque cellule correspondant à un exercice par exemple. Le raccourci Ctrl+Entrée n'exécute que la cellule actuelle (où est le curseur).
- Pour $n = 7246$, donner un encadrement élémentaire du logarithme décimal $\log(n)$.
 - Pour $n\in\N^*$, exprimer le nombre de chiffres décimaux de $n$ en fonction de $\log(n)$, et de la fonction partie entière, notée $\lfloor x\rfloor$.
 - En utilisant les fonctions 
math.floor(partie entière) etmath.log10(logarithme décimal), écrire une fonctionnb_chiffresqui renvoie le nombre chiffres d'un entier $n\in\N^*$. 
3. Quelques notions de Python
3.1. L'affichage avec print
La fonction print permet d'afficher un message, ou la valeur d'une variable.
def puiss_quatre(x): b = x*x # Une variable intermédiaire, qui vaut x² print("La variable b vaut", b) # Les deux arguments seront affichés, séparés d'un espace return b*b # On a b² = (x²)² = x⁴
Après évaluation du code précédent,
In [1]: puiss_quatre(3) La variable b vaut 9 Out[1]: 81
La fonction print prend un nombre arbitraire d'arguments (séparés par des virgules), qu'elle affiche, séparés d'un espace. À la fin, elle ajoute un retour à la ligne.
Quelles sont les valeurs affichées quand on évalue les extraits suivants ?
# Extrait 1 def f(a,b): z = 2*a+b return z x = f(1,2) y = f(2,1) print(x,y)
# Extrait 2 def f(a,b): z = 2*a+b return z x, y = 1, 1 # x=1 et y=1 x = f(x,y) y = f(x,y) print(x,y)
# Extrait 3 def f(a,b): return a*b x = 1 y = 2 z = f(y, f(y, f(x,y))) print(z)
- Écrire une fonction 
affiche_cin_puissqui prend en argument un entiern, affiche $3^n$, et ne renvoie rien. - Écrire une fonction 
cinq_puissqui prend en argument un entiernet qui renvoie $5^n$. - Sans utiliser l'opérateur 
**, utiliser une de ces deux fonctions pour déterminer le nombre de chiffres décimaux de $5^{(5^5)}$. 
3.2. Priorités opératoires
Les opérateurs de multiplications et divisions sont prioritaires sur l'addition et la soustraction, et réalisées de gauche à droite.
In [1]: 3 * 2 // 3 # (3 * 2) // 3 Out[1]: 2
On note $\phi = \frac{1+\sqrt{5}}{2}$ le nombre d'or. Comparer $e$ avec $z = \frac{4\phi +3\pi - 5}{4}$ (quel est le plus grand ?).
Laquelle des deux expressions $\left(a^b\right)^c$ et $a^{\left(b^c\right)}$ peut-on simplifier ?
Par convention, $a^{b^c} = a^{\left(b^c\right)}$.
Les opérations d'exponentiation sont réalisées de droite à gauche.
In [1]: 2 ** 3 ** 2 Out[1]: 512 # = 2⁹
3.3. Notion de couple
On peut représenter un couple de valeurs ou de variables en utilisant x, y ou (x,y).
In [1]: a = (3, 7) # définition d'un couple In [2]: a[0] # Le premier élément correspond à # l'indice 0 Out[2]: 3 In [2]: a[1] # Le second à l'indice 1 Out[2]: 7
# À partir de a, on peut récupérer les deux # valeurs par destructuration In [3]: x, y = a # affectation de deux variables In [4]: x Out[4]: 3 In [5]: y Out[5]: 7
L'affectation par couple peut être utilisée pour initialiser plusieurs variables en une seule ligne, ou échanger les valeurs de deux variables.
In [1]: x, y = 5, 7 # x = 5 et y = 7 In [2]: x, y Out[2]: (5, 7)
In [3]: x, y = y, x # Échange des valeurs de x,y In [4]: x, y Out[4]: (7, 5)
Attention il y a une différence entre une fonction prenant en argument un couple et une fonction avec deux arguments.
def f(x,y): # Deux arguments return x+y f(1,2)
def g(c): # c est un couple return c[0] + c[1] g((1,2))
Représentation de nombres complexes
On représente un nombre complexe $z = x + iy$ par le couple $(x,y)$.
La fonction affiche_complexe ci-après affiche la représentation algébrique d'un nombre complexe en argument, et ne renvoie rien. La fonction conjugue renvoie le nombre complexe conjugué.
# Affiche, et ne renvoie rien def affiche_complexe(z): print(z[0], "+", z[1], "i")
def affiche_complexe(z): x, y = z print(x, "+", y, "i")
In [1]: affiche_complexe((3, 7)) 3 + 7 i
# Cette fonction renvoie # un nouveau complexe def conjugue(z): return (z[0], -z[1])
def conjugue(z): x, y = z return (x, -y)
In [1]: conjugue((3, 7)) Out[1]: (3, -7) In [2]: affiche_complexe(conjugue((3, 7))) 3 + -7 i
- Écrire une fonction 
multiplicationqui prend en argument deux nombres complexes $z_1$ et $z_2$ et renvoie leur produit $z_1z_2$. - En utilisant 
conjugueet la question précédente, écrire une fonctiondivisionqui prend en argument deux nombres complexes $z_1$ et $z_2$, avec $z_2\neq 0$ et qui renvoie le quotient $\frac{z_1}{z_2}$. 4 - Écrire une fonction 
puissancequi prend en argument un nombre complexe $z$ et un entier $n\in\N$ et renvoie $z^n$. - Modifier cette dernière pour qu'elle marche pour tout $n\in\Z$ (si $z\neq 0$).
 
- Écrire une fonction 
modulequi prend un nombre complexezen argument et renvoie $|z|$. ★ Écrire une fonction
argumentqui renvoie l'argument dezdans l'intervalle $\interval]{-\pi, \pi}]$ (pour $z = 0$, renvoyer n'importe quoi).Indication : La fonction
math.atan($\arctan$) prend en argument un flottant $x$ et renvoie un flottant $\theta\in \interval]{-\frac{\pi}{2}, \frac{\pi}{2}}[$ tel que $\tan \theta = x$. Alternative :math.acosqui renvoie un angle appartenant à $[0,\pi]$.
Pour $z\in\C$, on définit $e^z\in\C$ comme la limite, quand $n\ra +\i$, de $\sum_{k=0}^n \frac{z^k}{k!}$.
Écrire une fonction
exponentiellequi prend $z$ en argument, et renvoie une valeur approchée de $e^z$.On interrompra le calcul de la somme au premier indice $k$ où $\big|\frac{z^k}{k!}\big| \leq 10^{-5}$.
- La fonction 
plot_complex_functionprend en argument une fonction $f\colon\C\ra\C$ et représente l'argument et le module de $f(z)$, en fonction de $z\in\C$. L'appeler sur les fonctions- $f(z) = z$
 - $f(z) = z^6 - 1$
 - $f(z) = e^z$.
 
 
On note $\Z[i] = \{a + ib,\, (a,b)\in\Z^2\}$ l'anneau des entiers de Gauss.
- Montrer que si $a, b\in\Z[i]$, et $b\neq 0$, il existe $q, r\in\Z[i]$ vérifiant $a = bq + r$ et $|r|\lt |b|$.
 - Implémenter cette division euclidienne dans $\Z[i]$.
 
3.4. ★ Localité de variables
Par défaut,
- toute variable définie à l'intérieur d'une fonction n'est pas accessible en dehors de la fonction. On dit que sa portée est locale.
 - les variables définies en dehors d'une fonction sont accessibles à l'intérieur de la fonction, mais ne peuvent pas être réaffectées depuis l'intérieur de la fonction.
 
def f(a,b): # z est une variable locale z = a * b return z f(1,2) print(z) # Erreur : z non défini
# x est une variable globale x = 2 def f(a): return a+x print(f(3)) # Affiche 5
x = 2 # variable globale def f(a,b): x = 3 # nouvelle variable locale # qui «cache» la globale return x print(f(1,2), x) # Affiche 3, 2
Il est en fait possible de réaffecter une variable globale depuis l'intérieur d'une fonction, en la déclarant comme telle.
compteur = 0 # Compte le nb d'appels de f def f(): global compteur # On spécifie que le nom compteur utilise une portée globale compteur += 1 f(); f() # deux appels de f print(compteur) # Affiche 2
3.5. ★ Mutabilité
Plutôt que de réaffecter une variable, certaines opérations peuvent modifier l'objet sous-jacent. Les types permettant ce genre d'opérations sont dits mutables. Les entiers et les flottants ne sont pas mutables, on ne peut que réaffecter des variables pointant vers une telle donnée. À l'intérieur d'une fonction, une telle réaffectation a une portée locale.
Les listes sont des objets mutables (contrairement aux chaînes de caractères). Une fonction peut donc modifier une liste qui lui est passée en argument.
x = 2 def f(a): a = a + 2 # Nouvelle affectation de la variable # locale a f(x) print(x) # Affiche 2, x n'a pas été modifiée
l = [1,2] # Une liste, un objet mutable def modifie(li): li[0] = -1 # Modification de la liste li li.append(3) # Modification de la liste li modifie(l); modifie(l) print(l) # Affiche [-1, 2, 3, 3] : l a été modifiée
4. Exercices
Écrire une fonction
normequi prend en argument trois flottantsx,y,zet qui renvoie la norme du vecteur $\vvv{x}{y}{z}$.- Écrire une nouvelle fonction 
norme_bisqui prenne plutôt en argument un triplet de flottants. 
Essayez : normenormebis
Pour $a,b,c,d\in\R$, on considère les équations polynomiales $$(E_2) \colon ax^2 + bx + c = 0 \quad \et \quad (E_3)\colon ax^3 + bx^2 +c x + d = 0.$$
- En supposant que $(E_2)$ admette deux solutions réelles, écrire une fonction qui prend en argument $a,b$ et $c$, et les renvoie. Pour renvoyer deux valeurs 
xety, on renvoie un couple :return x,y. - ★ Écrire une fonction qui prend en argument $a,b,c,d$ et renvoie 
Truesi et seulement si $(E_3)$ admet $3$ solutions distinctes. 
- Écrire une fonction 
chiffre_des_unitesqui prend en argument un entier naturelnet qui renvoie le chiffre des unités dans l'écriture décimale de $n$. - Écrire une fonction 
chiffre_des_dizainesqui prend en argument un entier naturelnet qui renvoie le chiffre des dizaines dans l'écriture décimale de $n$. 
On veut écrire une fonction premier_chiffre qui prend en argument un entier naturel $n$ et renvoie le premier chiffre de son écriture décimale. Par exemple, premier_chiffre(1024) renverra 1.
- Écrire une fonction 
premier_chiffre1en utilisant les fonctions du modulemath. - Écrire une fonction 
premier_chiffre2en utilisant les fonctionsstretint, qui permettent de faire des conversions de type. Par exemple, l'appelstr(1024)renvoie"1024", l'appelint("1024")renvoie1024. Sicest une chaîne de caractères, l'appelc[0]renvoie le premier caractère de cette chaîne. - Écrire une fonction 
premier_chiffre3en utilisant une bouclewhileet les opérateurs entiers. - ★ Discuter des avantages/inconvénients de chaque méthode, en termes d'efficacité et de correction.
 
- Écrire une fonction 
troisiemequi prend deux éléments $a,b$ distincts de $\db{0,2}$ et qui renvoie le troisième élément. - Généraliser, sous forme d'une fonction prenant en argument une liste 
lde $n-1$ éléments distincts de $\db{0, n-1}$, et qui renvoie l'élément manquant. 
Soit $N = 7^{15}!$ (factorielle de $7^{15}$).
- Déterminer le nombre de $0$ à la fin de l'écriture décimale de $N$, puis le dernier chiffre non nul.
 - Quel est l'ordre de grandeur du nombre de chiffres décimaux de $N$ ?
 
Écrire une fonction alignés qui prend en argument trois points de $\Z^2$ chacun représenté par un couple d'entiers et renvoie le booléen True si les trois points sont sur une même droite, et False sinon.
On peut renvoyer un booléen en utilisant les opérateurs de comparaisons : return a == b, return a > b ou return a <= b.
Soient $A,B,C$ trois points du plan, d'affixes $z_A, z_B, z_C$.
- Quelle est l'aire du triangle ABC, en fonction des longueurs $AB$, $BC$ et de l'angle non orienté $\wh{ABC}$ ?
 
On dit que le triangle $ABC$ est orienté positivement si le point $C$ est à gauche de la demi-droite orientée $[AB)$, c'est-à-dire «si les points $A,B,C$ tournent dans le sens trigonométrique». Sinon, le triangle est orienté négativement. De manière équivalente, l'orientation est égale au signe de $\sin \theta$, où $\theta$ est l'angle orienté $\theta = (\oa{BC}, \oa{BA})$. On définit alors l'aire orientée de $ABC$ comme $\mc A_{ABC} = \sin \theta \lN\oa{BC}\rN \lN \oa{BA}\rN$.
Justifier que $\mc A_{ABC} = \frac{1}{2}\Im \big((z_A - z_B) \ol{(z_C-z_B)}\big)$. En utilisant les fonctions de l'exercice No description for this link, écrire une fonction qui prend en argument les trois affixes $z_A, z_B, z_C$ et renvoie l'aire orientée.
L'aire orientée est également donnée par le déterminant $\mc A_{ABC} = \frac{1}{2}\begin{vmatrix}x_C - x_B & x_A - x_B \\ y_C- y_B & y_A - y_B\end{vmatrix}$.
Notes de bas de page:
Wall time est le temps réel écoulé. Son nom fait référence à une horloge sur un mur.
En un certain sens, vous êtes capable de calculer $10^{100}$ plus rapidement qu'un ordinateur.
Pouvez-vous calculer $7^{(2^2)}$ à la main avec seulement deux multiplications ?
Utiliser $\frac{z_1}{z_2} = \frac{z_1 \ol{z_2}}{|z_2|^2}$.